﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.Clientes.Presenter;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Clientes.View.SmartClient
{
    /// <summary>
    /// Interaction logic for CadastroCorrespondente.xaml
    /// </summary>
    public partial class CadastroCorrespondentes : SinacorWindow, ICadastroCorrespondente
    {
        #region Campos

        private Presenter.CadastroCorrespondentes _presenter;

        #endregion

        #region Propriedades

        public Model.Correspondente CurrentModel
        {
            get
            {
                if (this.grdCorrespondentes.EditItem != null)
                    return this.grdCorrespondentes.EditItem as Model.Correspondente;
                else if (this.grdCorrespondentes.Items.CurrentItem != null)
                    return this.grdCorrespondentes.Items.CurrentItem as Model.Correspondente;
                else if (this.grdCorrespondentes.SelectedItem != null)
                    return this.grdCorrespondentes.SelectedItem as Model.Correspondente;
                else if (this.grdCorrespondentes.SelectedIndex >= 0)
                    return this.grdCorrespondentes.Items[this.grdCorrespondentes.SelectedIndex] as Model.Correspondente;
                else
                    return null;
            }
            set
            {
                if (CurrentModel.State == State.Unchanged)
                    grdCorrespondentes.Update(value);
            }
        }

        public DependencyObject CurrentRowCorrespondentes
        {
            get
            {
                if (this.grdCorrespondentes.IsInserting)
                    return this.grdCorrespondentes.GetInsertionRow();
                else if (this.grdCorrespondentes.IsEditing)
                    return this.grdCorrespondentes.GetEditRow();
                else
                    return null;
            }
        }

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public CadastroCorrespondentes()
        {
            InitializeComponent();

            _presenter = new Sinacor.UI.Bovespa.Clientes.Presenter.CadastroCorrespondentes(this);
            this.grdCorrespondentes.NewItemType = typeof(Model.Correspondente);
            this.AfterInitialize += new RoutedEventHandler(CadastroCorrespondentes_AfterInitialize);
        }

        #endregion

        #region ICadastroCorrespondente Members

        /// Historico:
        /// Data : 10/08/2009
        /// Autor: Felipe Barbosa Gonzalez
        /// 7Comm Informativa   
        /// Obs.: Criado os metodos  CarregarCliente, AtualizarGradeCorrespondente, PerderFoco, ConfirmarExclusaoCorrespondente, InformarCorrespondenteAlteradoComSucesso, InformarCorrespondenteExcluidoComSucesso, InformarCorrespondenteSalvoComSucesso, InformarNenhumCorrespondenteEncontrado,
        /// buttonPesquisa_Click, grdCorrespondentes_EndingInsert, grdCorrespondentes_EndingUpdate, grdCorrespondentes_Deleting, buttonNovaPesquisa_Click

        public void CarregarCliente(Sinacor.UI.Bovespa.Clientes.Model.Parameter.Cliente cliente)
        {
            ((Model.Correspondente)this.grdCorrespondentes.EditItem).Nome = cliente.Nome;
            ((Model.Correspondente)this.grdCorrespondentes.EditItem).NomeResumidoCorrespondente = cliente.NomeResumido;
        }

        public void Inicializar()
        {

            _presenter.Inicializar();
            this.AtualizarGradeCorrespondente();
        }
        void CadastroCorrespondentes_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.Inicializar();
            this.DataContext = _presenter;
        }

       
        public void AtualizarGradeCorrespondente()
        {
            this.grdCorrespondentes.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void PerderFoco()
        {
            this.ClearServiceErrors();
            if (grdCorrespondentes.EditItem != null)
            {
                Model.Correspondente correspondente = grdCorrespondentes.EditItem as Model.Correspondente;
                Model.Parameter.FiltroCliente chave = new Sinacor.UI.Bovespa.Clientes.Model.Parameter.FiltroCliente();
                if (correspondente.Codigo.HasValue)
                {
                    chave.Codigo = correspondente.Codigo.Value;
                    if (chave.Codigo.Value != 0)
                        _presenter.ValidarCodigoCliente(chave);
                }
            }
        }

        public bool ConfirmarExclusaoCorrespondente()
        {
            return SinacorMessageBox.Show(TryFindResource("Bovespa.Cliente.Message.QuestaoConfirmacaoExcluirCorrespondente").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes;
        }

        public void InformarCorrespondenteAlteradoComSucesso()
        {
            SinacorMessageBox.Show(TryFindResource("Bovespa.Cliente.Message.CorrespondenteAlteradoComSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarCorrespondenteExcluidoComSucesso()
        {
            SinacorMessageBox.Show(TryFindResource("Bovespa.Cliente.Message.RegistroCorrespondenteExcluidoComSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarCorrespondenteSalvoComSucesso()
        {
            SinacorMessageBox.Show(TryFindResource("Bovespa.Cliente.Message.InclusaoCorrespondenteRealizadaComSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarNenhumCorrespondenteEncontrado()
        {
            SinacorMessageBox.Show(TryFindResource("Bovespa.Clientes.Message.RegistroNaoEncontrado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion

        #region Eventos

        private void buttonPesquisa_Click(object sender, RoutedEventArgs e)
        {
            this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
            _presenter.ConsultarCorrespondentes();
        }

        private void grdCorrespondentes_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                if (this.grdCorrespondentes.IsInserting)
                {
                    if (!_presenter.IncluirCorrespondente(this.grdCorrespondentes.EditItem as Model.Correspondente))
                        e.Cancel = true;                   
                }
            }
        }

        private void grdCorrespondentes_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
        }

        private void grdCorrespondentes_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
        }

        private void grdCorrespondentes_EndingUpdate(object sender, CancelItemEventArgs e)
        {

            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                if (this.grdCorrespondentes.IsUpdating)
                {
                    if (!_presenter.AlterarCorrespondente(this.grdCorrespondentes.EditItem as Model.Correspondente))                       
                        e.Cancel = true;
                }
            }
        }

        private void grdCorrespondentes_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                if (this.grdCorrespondentes.SelectedIndex > -1)
                {
                    Model.Parameter.FiltroCorrespondente filtroCorrespondente = new Sinacor.UI.Bovespa.Clientes.Model.Parameter.FiltroCorrespondente();
                    Model.Correspondente correspondenteSelecionado = this.grdCorrespondentes.SelectedItem as Model.Correspondente;
                    filtroCorrespondente.Codigo = correspondenteSelecionado.Codigo.Value;
                    if (!this._presenter.ExcluirCorrespondente(filtroCorrespondente))
                    {
                        e.Cancel = true;
                    }
                }
            }
        }

        private void buttonNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            _presenter.FiltroCorrespondente.Nome = string.Empty;
            _presenter.FiltroCorrespondente.Codigo = null;
            this.txtCodigo.Focus();
            AtualizarGradeCorrespondente();
        }
        private void SinacorInt32TextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            this.PerderFoco();
        }

        /// <summary>
        /// InsertBegun evento
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void grdCorrespondentes_InsertBegun(object sender, ItemEventArgs e)
        {            
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.EfetuarValidacaoBroker();
            }
        }

        /// <summary>
        /// UpdateBegun evento
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void grdCorrespondentes_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.EfetuarValidacaoBroker();
            }
        }

        #endregion

        #region Metodos

        private void EfetuarValidacaoBroker()
        {
            SinacorCheckBox chkIndicadorBroker = null;

            if (this._presenter.ParametroBolsa != null && !this._presenter.ParametroBolsa.Correspondente)
            {
                this.CurrentModel.IndicadorBroker = true;

                if (CurrentRowCorrespondentes != null)
                {
                    chkIndicadorBroker = (ControlHelper.FindChild(CurrentRowCorrespondentes, "chkIndicadorBroker") as SinacorCheckBox);

                    if (chkIndicadorBroker != null)
                        chkIndicadorBroker.IsEnabled = false;
                }
            }
        }

        #endregion
    }
}
